

#include <EC11.h>

/************************************************************************************************
    函数名称：Encoder
    函数功能：编码器旋转的扫描及处理
    入口参数：无
    出口参数：uchar型    0-无旋转   'R'-正转(向右转)   'L'-反转(向左转)
************************************************************************************************/
unsigned char Encoder(void)
{
	
    static bit Enc0=0,Enc1=0;
    static unsigned char EncOld,EncX=0;
    unsigned char EncNow;
    bit EncType=0; //设置编码器类型: 0为一定位一脉冲,1为两定位一脉冲

    PINA=1;        //PINA置高电平
    PINB=1;        //PINB置高电平
    if(Enc0==0)EncOld=(PINA?0x02:0x00)+(PINB?0x01:0x00),Enc0=1;  //记住初次调用时编码器的状态
    EncNow=(PINA?0x02:0x00)+(PINB?0x01:0x00);        //根据两个IO当前状态组合成16进制的0x00|0x01|0x02|0x03
    if(EncNow==EncOld)return(0);                                //如果新数据和原来的数据一样(没有转动)就直接返回0

    if(EncOld==0x00&&EncNow==0x02||EncOld==0x03&&EncNow==0x01)EncX=EncNow;         //00-10|11-01
    if(EncOld==0x00&&EncX==0x02&&EncNow==0x03||EncOld==0x03&&EncX==0x01&&EncNow==0x00)//00-10-11|11-01-00右转
    {
        EncOld=EncNow,EncX=0;
        if(EncType==1)return('R');   //两定位一脉冲
        else       //一定位一脉冲
        {
            if(Enc1==0)Enc1=1;
            else
            {
                //Delayms(60);       //延时降低旋转灵敏度(不能用在定时器中)
                Enc1=0;
                return('R');
            }
        }
    }

    if(EncOld==0x00&&EncNow==0x01||EncOld==0x03&&EncNow==0x02)EncX=EncNow;         //00-01|11-10
    if(EncOld==0x00&&EncX==0x01&&EncNow==0x03||EncOld==0x03&&EncX==0x02&&EncNow==0x00)//00-01-11|11-10-00左转
    {
        EncOld=EncNow,EncX=0;
        if(EncType==1)return('L');   //两定位一脉冲
        else           //一定位一脉冲
        {
            if(Enc1==0)Enc1=1;
            else
            {
                //Delayms(60);       //延时降低旋转灵敏度(不能用在定时器中)
                Enc1=0;
                return('L');
            }
        }
    }
    return(0);           //没有正确解码返回0
}
